#include "sqliteutil.h"
#include <QDebug>
#include <QApplication>

const QString SqliteUtil::TABLE_NAME = "lock";

SqliteUtil::SqliteUtil(const QString database) : m_strDb(database)
{
    createConnection(database);
}

SqliteUtil::~SqliteUtil()
{
    deleteTable(QString("stu"));
    m_db.close();
}

bool SqliteUtil::createConnection(const QString conn)
{
    // 建立数据库连接
    if (QSqlDatabase::contains("my_conn")) {
        m_db = QSqlDatabase::database("my_conn");
    } else  {
        m_db = QSqlDatabase::addDatabase("QSQLITE", "my_conn");
    }
    // 设置数据库名称
    m_db.setDatabaseName(QApplication::applicationDirPath() + "/" +conn);
    // 打开数据库
    if (!m_db.open()) {
        qDebug() << "open database failed";
        return false;
    } else {
        qDebug() << "open database success";
        return true;
    }
}

void SqliteUtil::createTable(const QString table_name)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    const QString create_sql = "create table " + table_name + " (id integer primary key autoincrement, board_pos int, lock_pos int, status varchar(16))";
    executeQuery(create_sql);
}

QSqlRecord SqliteUtil::executeRecord(const QString query)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QSqlQuery sql_query(m_db);
    sql_query.prepare(query);
    sql_query.exec();
    return sql_query.record();
}

QSqlRecord SqliteUtil::executeRecord(const QString query, QVariant lstParameter)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QSqlQuery sql_query(m_db);
    sql_query.prepare(query);
    sql_query.bindValue(0, lstParameter);
    sql_query.exec();
    return sql_query.record();
}

int SqliteUtil::executeInt(const QString query)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QSqlQuery sql_query(m_db);
    sql_query.prepare(query);
    sql_query.exec();
    int id = 0;
    while(sql_query.next()) {
        id = sql_query.value(0).toInt();
    }
    return id;
}

int SqliteUtil::executeInt(const QString query, QList<QVariant> lstParameter)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QSqlQuery sql_query(m_db);
    sql_query.prepare(query);
    for(int i = 0; i < lstParameter.count(); i++) {
        sql_query.bindValue(i, lstParameter[i]);
    }
    sql_query.exec();
    int id = 0;
    while(sql_query.next()) {
        id = sql_query.value(0).toInt();
    }
    emit inserted();
    return id;
}

QSqlQuery SqliteUtil::executeQuery(const QString query)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QSqlQuery sql_query(m_db);
    sql_query.setForwardOnly(true);
    sql_query.prepare(query);
    sql_query.exec();
    return sql_query;
}

QSqlQuery SqliteUtil::executeQuery(const QString query, QList<QVariant> lstParameter)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QSqlQuery sql_query(m_db);
    sql_query.setForwardOnly(true);
    sql_query.prepare(query);
    for (int i = 0; i < lstParameter.count(); i++) {
        sql_query.bindValue(i, lstParameter[i]);
    }
    sql_query.exec();
    return sql_query;
}

void SqliteUtil::executeQueryModel(QSqlQueryModel *p_queryModel, const QString query)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    p_queryModel->setQuery(query, m_db);
}

void SqliteUtil::executeQueryModel(QSqlQueryModel *p_queryModel, QVariant id)
{
    if (!m_db.isOpen()) {
        createConnection(m_strDb);
    }
    QString query = QString("select * from %1 where id = ").arg(SqliteUtil::TABLE_NAME) + id.toString();
    p_queryModel->setQuery(query, m_db);
}

void SqliteUtil::deleteTable(QString table_name)
{
    QString query = "drop table " + table_name;
    executeQuery(query);
}
